<!DOCTYPE html>
<html lang="en-us">
  <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <meta http-equiv="X-UA-Compatible" content="chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="robots" content="noodp"/>
  <meta name="author" content="Mr.wei">
  
  
  
  
  <link rel="next" href="http://blog.mr-wei.cn/2019/uart%E7%AE%80%E8%BF%B0/" />
  <link rel="canonical" href="http://blog.mr-wei.cn/2019/i2c%E7%AE%80%E8%BF%B0/" />
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
  <link rel="manifest" href="/site.webmanifest">
  <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
  <meta name="msapplication-TileColor" content="#da532c">
  <meta name="theme-color" content="#ffffff">
  <title>
       
       
           I2C简述 | Mr.wei
       
  </title>
  <meta name="title" content="I2C简述 | Mr.wei">
    
  
  <link rel="stylesheet" href="/font/iconfont.css">
  <link rel="stylesheet" href="/css/main.min.css">


  
  
 

<script type="application/ld+json">
 "@context" : "http://schema.org",
    "@type" : "BlogPosting",
    "mainEntityOfPage": {
         "@type": "WebPage",
         "@id": "http:\/\/blog.mr-wei.cn"
    },
    "articleSection" : "posts",
    "name" : "I2C简述",
    "headline" : "I2C简述",
    "description" : "I2C总线的总体特征 SDA和SCL信号 SDA和SCL都是双向线路，都通过一个电流源或上拉电阻连接到正的电源电压，当总线空闲时，两条线路都是高电平。连接到总线的器件输出级必须是漏极开路或集电极开路。I2C总线上数据的传输速率在 Standard-mode下可达到100Kbit\/s，Fast-mode下可达400Kbit\/s，Fast-mode Plus 下可达1Mbit\/s，High-speed mode 下可达3.4Mbit\/s。连接到总线的接口数量只由总线电容400pF限制。\nSDA和SCL逻辑电平的定义 I2C总线的逻辑电平不是固定值而是依赖于电源电压VDD。 逻辑0 ：低于0.3VDD 逻辑1 ：高于0.7VDD 起始与终止位 起始位：当SCL为高电平时SCL从高电平转换为低电平  终止位：当SCL为高电平时SCL从低电平转换为高电平 起始位和终止位一般由主机产生，总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后，总线被认为再次处于空闲状态。如果产生重复起始条件而不产生停止条件，总线会一直处于忙的状态。 传输数据的有效性 SDA上的数据必须在SCL的高电平周期保持稳定。 SDA上数据的转换必须在SCL的低电平周期完成。 一个时钟周期完成一个bit数据的传输。 数据格式 发送到SDA线上的每个字节必须为8为。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个ACK。如果从机要完成一些其他功能后才能接收或发送下一个完整的数据字节，可以使SCL保持低电平迫使主机进入等待状态，当从机准备好接收下一个数据并释放SCL后，主机继续传输数据。 从机地址和R\/W位 I2C总线产生起始位后，发送的第一个字节是从机地址和R\/W位，从机地址由7bit数据构成，第8个bit决定了数据的方向，第8个bit为0表示向从设备写入数据，第8个比特为1表示读取从设备的数据\nACK和NACK ACK的作用是接受方通知发送方一个字节数据接收完成成可以发送下一个字节数据的信号。ACK的时钟由主机产生。 ACK 定义为发送方在响应时钟期间释放SDA线，接收方需要拉低SDA线为低电平，并且在时钟的高电平期间保持稳定。 NACK定义为在响应时钟的高电平期间SDA线保持高电平状态。\n产生NACK的原因  总线上从机的地址没有和主机发送的地址相匹配的 从机正在执行一些实时处理的任务，无法和主机通信 接收方无法理解接收到的数据 接收方不能够接收更多的数据 主机读取从机数据时，通知从机读到了最后一个字节数据。  标准模式时序图    Symbol Parameter Conditions Min Max     fSCL SCL clock frequency   100KHz   tHD;STA hold time (repeated) START condition After this period, the first clock pulse is generated 4.",
    "inLanguage" : "en-us",
    "author" : "Mr.wei",
    "creator" : "Mr.wei",
    "publisher": "Mr.wei",
    "accountablePerson" : "Mr.wei",
    "copyrightHolder" : "Mr.wei",
    "copyrightYear" : "2019",
    "datePublished": "2019-08-29 12:38:10 \x2b0800 CST",
    "dateModified" : "2019-08-29 12:38:10 \x2b0800 CST",
    "url" : "http:\/\/blog.mr-wei.cn\/2019\/i2c%E7%AE%80%E8%BF%B0\/",
    "wordCount" : "511",
    "keywords" : [ "I2C", "Mr.wei"]
}
</script>

</head>

  


  <body class="">
    <div class="wrapper">
        <nav class="navbar">
    <div class="container">
        <div class="navbar-header header-logo">
        	<a href="javascript:void(0);" class="theme-switch"><i class="iconfont icon-xihuan"></i></a>&nbsp;<a href="http://blog.mr-wei.cn">Mr.wei</a>
        </div>
        <div class="menu navbar-right">
                
                
                <a class="menu-item" href="/posts/" title="">Blog</a>
                
                <a class="menu-item" href="http://balance.mr-wei.cn" title="">BalanceCar</a>
                
                <a class="menu-item" href="/categories/" title="">Categories</a>
                
                <a class="menu-item" href="/tags/" title="">Tags</a>
                
                <a class="menu-item" href="/about/" title="About">About</a>
                
        </div>
    </div>
</nav>
<nav class="navbar-mobile" id="nav-mobile" style="display: none">
     <div class="container">
        <div class="navbar-header">
            <div>  <a href="javascript:void(0);" class="theme-switch"><i class="iconfont icon-xihuan"></i></a>&nbsp;<a href="http://blog.mr-wei.cn">Mr.wei</a></div>
            <div class="menu-toggle">
                <span></span><span></span><span></span>
            </div>
        </div>
     
          <div class="menu" id="mobile-menu">
                
                
                <a class="menu-item" href="/posts/" title="">Blog</a>
                
                <a class="menu-item" href="http://balance.mr-wei.cn" title="">BalanceCar</a>
                
                <a class="menu-item" href="/categories/" title="">Categories</a>
                
                <a class="menu-item" href="/tags/" title="">Tags</a>
                
                <a class="menu-item" href="/about/" title="About">About</a>
                
        </div>
    </div>
</nav>







    	 <main class="main">
          <div class="container">
      		
<article class="post-warp" itemscope itemtype="http://schema.org/Article">
    <header class="post-header">
        <h1 class="post-title" itemprop="name headline">I2C简述</h1>
        <div class="post-meta">
                Written by <a itemprop="name" href="http://blog.mr-wei.cn" rel="author">Mr.wei</a> with ♥ 
                <span class="post-time">
                on <time datetime=2019-08-29 itemprop="datePublished">August 29, 2019</time>
                </span>
                in
                <i class="iconfont icon-folder"></i>
                <span class="post-category">
                        
                </span>
        </div>
    </header>
    <div class="post-content">
        

        
            
        

        
        
     
          
          
          

          
          
          

          

<h1 id="i-sup-2-sup-c总线的总体特征">I<sup>2</sup>C总线的总体特征</h1>

<h2 id="sda和scl信号">SDA和SCL信号</h2>

<p>SDA和SCL都是双向线路，都通过一个电流源或上拉电阻连接到正的电源电压，<u>当总线空闲时，两条线路都是高电平</u>。连接到总线的器件<u>输出级必须是漏极开路或集电极开路</u>。I<sup>2</sup>C总线上数据的传输速率在 Standard-mode下可达到100Kbit/s，Fast-mode下可达400Kbit/s，Fast-mode Plus 下可达1Mbit/s，High-speed mode 下可达3.4Mbit/s。连接到总线的接口数量只由总线电容400pF限制。</p>

<h2 id="sda和scl逻辑电平的定义">SDA和SCL逻辑电平的定义</h2>

<p>I<sup>2</sup>C总线的逻辑电平不是固定值而是依赖于电源电压V<sub>DD</sub>。<br/>
逻辑0   ：低于0.3V<sub>DD</sub><br/>
逻辑1     ：高于0.7V<sub>DD</sub><br/>
<figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer1.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h2 id="起始与终止位">起始与终止位</h2>

<p>起始位：<u>当SCL为高电平时SCL从高电平转换为低电平</u> <br/>
终止位：<u>当SCL为高电平时SCL从低电平转换为高电平</u><br/>
起始位和终止位一般由主机产生，总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后，总线被认为再次处于空闲状态。如果产生重复起始条件而不产生停止条件，总线会一直处于忙的状态。
<figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer2.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h2 id="传输数据的有效性">传输数据的有效性</h2>

<p>SDA上的数据必须在SCL的高电平周期保持稳定。<br\>
SDA上数据的转换必须在SCL的低电平周期完成。<br\>
一个时钟周期完成一个bit数据的传输。
<figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer3.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h2 id="数据格式">数据格式</h2>

<p>发送到SDA线上的每个字节必须为8为。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个ACK。如果从机要完成一些其他功能后才能接收或发送下一个完整的数据字节，可以使SCL保持低电平迫使主机进入等待状态，当从机准备好接收下一个数据并释放SCL后，主机继续传输数据。
<figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer4.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h2 id="从机地址和r-w位">从机地址和R/W位</h2>

<p>I<sup>2</sup>C总线产生起始位后，发送的第一个字节是从机地址和R/W位，<u>从机地址由7bit数据构成，第8个bit决定了数据的方向，第8个bit为0表示向从设备写入数据，第8个比特为1表示读取从设备的数据</u></p>

<p><figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer5.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h2 id="ack和nack">ACK和NACK</h2>

<p>ACK的作用是接受方通知发送方一个字节数据接收完成成可以发送下一个字节数据的信号。ACK的时钟由主机产生。<br\>
ACK 定义为发送方在响应时钟期间释放SDA线，接收方需要拉低SDA线为低电平，并且在时钟的高电平期间保持稳定。<br\>
NACK定义为在响应时钟的高电平期间SDA线保持高电平状态。</p>

<h3 id="产生nack的原因">产生NACK的原因</h3>

<ol>
<li>总线上从机的地址没有和主机发送的地址相匹配的</li>
<li>从机正在执行一些实时处理的任务，无法和主机通信</li>
<li>接收方无法理解接收到的数据</li>
<li>接收方不能够接收更多的数据</li>
<li>主机读取从机数据时，通知从机读到了最后一个字节数据。</li>
</ol>

<h2 id="标准模式时序图">标准模式时序图</h2>

<p><figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer6.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<table>
<thead>
<tr>
<th>Symbol</th>
<th>Parameter</th>
<th>Conditions</th>
<th>Min</th>
<th>Max</th>
</tr>
</thead>

<tbody>
<tr>
<td>fSCL</td>
<td>SCL clock frequency</td>
<td></td>
<td></td>
<td>100KHz</td>
</tr>

<tr>
<td>tHD;STA</td>
<td>hold time (repeated) START condition</td>
<td>After this period, the first clock pulse is generated</td>
<td>4.0us</td>
<td></td>
</tr>

<tr>
<td>tSU;STA</td>
<td>set-up time for a repeated START condition</td>
<td></td>
<td>4.7us</td>
<td></td>
</tr>

<tr>
<td>tSU;STO</td>
<td>set-up time for STOP condition</td>
<td></td>
<td>4.0us</td>
<td></td>
</tr>

<tr>
<td>tBUF</td>
<td>bus free time between a STOP and START condition</td>
<td></td>
<td>4.7us</td>
<td></td>
</tr>

<tr>
<td>tLOW</td>
<td>LOW period of the SCL clock</td>
<td></td>
<td>4.7us</td>
<td></td>
</tr>

<tr>
<td>tHIGH</td>
<td>HIGH period of the SCL clock</td>
<td></td>
<td>4.0us</td>
<td></td>
</tr>

<tr>
<td>tHD;DAT</td>
<td>data hold time</td>
<td></td>
<td>0us</td>
<td></td>
</tr>

<tr>
<td>tSU;DAT</td>
<td>data set-up time</td>
<td></td>
<td>250ns</td>
<td></td>
</tr>

<tr>
<td>tr</td>
<td>rise time of both SDA and SCL signals</td>
<td></td>
<td></td>
<td>1000ns</td>
</tr>

<tr>
<td>tf</td>
<td>fall time of both SDA and SCL signals</td>
<td></td>
<td></td>
<td>300ns</td>
</tr>

<tr>
<td>tVD;DAT</td>
<td>data valid time</td>
<td></td>
<td></td>
<td>3.45us</td>
</tr>

<tr>
<td>tVD;ACK</td>
<td>data valid acknowledge time</td>
<td></td>
<td></td>
<td>3.45us</td>
</tr>
</tbody>
</table>

<h1 id="i-sup-2-sup-c总线数据传输方式">I<sup>2</sup>C总线数据传输方式</h1>

<h3 id="主机向从机发送数据">主机向从机发送数据</h3>

<p><figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer7.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h3 id="主机读取从机中的数据">主机读取从机中的数据</h3>

<p><figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer8.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h3 id="组合方式">组合方式</h3>

<p><figure><img src="/images/ring.svg" data-sizes="auto" data-src="http://pan.mr-wei.cn/image/Blog_image/I2C%E5%8D%8F%E8%AE%AE/Figer9.png" alt="" class="lazyload"><figcaption class="image-caption"></figcaption></figure></p>

<h1 id="模拟i2c">模拟I2C</h1>

<ul>
<li><p>I2C_CONFIG.H</p>

<pre><code class="language-C">#ifndef __I2C_CONFIG_H_
#define __I2C_CONFIG_H_
//
#include &quot;nrf_gpio.h&quot;
#include &quot;nrf_delay.h&quot;
//Delay config													
#define Delay_us(us)							nrf_delay_us(us)
//Pin config
#define I2C_SCL_PIN_CONFIG						   				nrf_gpio_cfg_output(27)
#define I2C_SDA_PIN_CONFIG_IN						nrf_gpio_cfg_input(26,NRF_GPIO_PIN_NOPULL)
#define I2C_SDA_PIN_CONFIG_OUT						nrf_gpio_cfg_output(26)
#define I2C_SCL_H							nrf_gpio_pin_write(27, 1)
#define I2C_SCL_L							nrf_gpio_pin_write(27, 0)
#define I2C_SDA_H							nrf_gpio_pin_write(26, 1)
#define I2C_SDA_L							nrf_gpio_pin_write(26, 0)
#define I2C_SDA_D							nrf_gpio_pin_read(26)		
#endif	//__I2C_CONFIG_H_

</code></pre></li>

<li><p>I2C.H</p>

<pre><code class="language-C">#ifndef __I2C_H_
#define __I2C_H_
#include &lt;stdint.h&gt;
void I2C_Init(void);
uint8_t I2C_ReadData(uint8_t address,uint8_t *buffer,uint16_t length);
uint8_t I2C_SendData(uint8_t address,uint8_t *buffer,uint16_t length);
uint8_t I2C_Read_Salve_Reg(uint8_t address,uint8_t reg,uint8_t *buffer,uint8_t length);
#endif

</code></pre></li>

<li><p>I2C.C</p>

<pre><code class="language-C">#include &quot;I2C.H&quot;
#include &quot;I2C_CONFIG.H&quot;
/*
* Init I2C
*/
void I2C_Init(void)
{
	I2C_SCL_PIN_CONFIG;
	I2C_SDA_PIN_CONFIG_OUT;	
}
/*
* Start condition generated
*/
static void I2C_Start(void)
{
	I2C_SDA_PIN_CONFIG_OUT;
	I2C_SCL_H;
	I2C_SDA_H;
	Delay_us(10);
	I2C_SDA_L;
	Delay_us(10);
	I2C_SCL_L;
	Delay_us(5);
}
/*
* Stop condition generated
*/
static void I2C_Stop(void)
{
	I2C_SDA_PIN_CONFIG_OUT;
	Delay_us(5);
	I2C_SCL_H;
	I2C_SDA_L;
	Delay_us(10);
	I2C_SDA_H;
}
/*
* Generate ACK or NACK
*/
static void I2C_Generate_ACK(uint8_t ACK)
{
	I2C_SDA_PIN_CONFIG_OUT;
	if(ACK)
	{
	I2C_SDA_L;
	Delay_us(5);
	I2C_SCL_H;
	Delay_us(10);
	I2C_SCL_H;
	Delay_us(5);
	I2C_SDA_H;
	}else
	{	
	I2C_SDA_L;
	Delay_us(5);
	I2C_SCL_H;
	Delay_us(10);
	I2C_SCL_L;
	Delay_us(5);
	I2C_SDA_H;
	}
}
/*
* Check ACK 
*/
static uint8_t I2C_Check_ACK(void)
{
	uint8_t ACK=0;
	I2C_SDA_PIN_CONFIG_IN;
	Delay_us(5);
	I2C_SCL_H;
	Delay_us(10);
	ACK = I2C_SDA_D;
	I2C_SCL_L;
	Delay_us(5);
	return ACK;
}
/*
* Send Byte
*/
void I2C_SendByte(uint8_t Byte)
{
	uint8_t i=0;
	I2C_SDA_PIN_CONFIG_OUT;
	for(i=0;i&lt;8;i++)
	{
		(Byte&amp;0x80)?(I2C_SDA_H):(I2C_SDA_L);
		Delay_us(5);
		I2C_SCL_H;
		Delay_us(10);
		I2C_SCL_L;
		Delay_us(5);
		Byte&lt;&lt;=1;
	}
}
/*
* Read Byte
*/
uint8_t I2C_ReadByte(void)
{
	int8_t i=0;
	uint8_t data=0;
	I2C_SDA_PIN_CONFIG_IN;
	for(i=7;i&gt;0;i--)
	{
		Delay_us(5);
		I2C_SCL_H;
		Delay_us(10);
		data |= (I2C_SDA_D&lt;&lt;i);
		I2C_SCL_L;
		Delay_us(5);
	}
		Delay_us(5);
		I2C_SCL_H;
		Delay_us(10);
		data |= I2C_SDA_D;
		I2C_SCL_L;
		Delay_us(5);
	return data;	
}

/*
* Read data
*/
uint8_t I2C_ReadData(uint8_t address,uint8_t *buffer,uint16_t length)
{
	uint16_t i;
	I2C_Start();
	I2C_SendByte(address|0x01);
	if(I2C_Check_ACK())
		I2C_Stop();
	for(i=1;i&lt;length;i++)
	{
		*buffer=I2C_ReadByte();
		 buffer++;
		 I2C_Generate_ACK(0);
	}
	*buffer=I2C_ReadByte();
	I2C_Generate_ACK(1);
	I2C_Stop();
	return i;	
}
/*
* Send data
*/
uint8_t I2C_SendData(uint8_t address,uint8_t *buffer,uint16_t length)
{
	uint16_t i;
	I2C_Start();
	I2C_SendByte(address&amp;0xFE);
	if(I2C_Check_ACK())
		I2C_Stop();
	for(i=0;i&lt;length;i++)
	{
		I2C_SendByte(*buffer);
		if(I2C_Check_ACK())
		{
			I2C_Stop();
			return i;
		}
		buffer++;
	}
	I2C_Stop();
	return i;
}
/*
* Read salve register data
*/
uint8_t I2C_Read_Salve_Reg(uint8_t address,uint8_t reg,uint8_t *buffer,uint8_t length)
{
	uint16_t i;
	I2C_Start();
	I2C_SendByte(address&amp;0xFE);
	if(I2C_Check_ACK())
	{
		I2C_Stop();
		return 0;
	}
	I2C_SendByte(reg);
	if(I2C_Check_ACK())
	{
		I2C_Stop();
		return 0;
	}
	I2C_Stop();
	I2C_Start();
	I2C_SendByte(address|0x01);
	if(I2C_Check_ACK())
	{
		I2C_Stop();
		return 0;
	}
	
	for(i=1;i&lt;length;i++)
	{
		*buffer=I2C_ReadByte();
		 buffer++;
		 I2C_Generate_ACK(0);
	}
	*buffer=I2C_ReadByte();
	I2C_Generate_ACK(1);
	I2C_Stop();
	return i;	
}
</code></pre></li>
</ul>

<h1 id="参考资料">参考资料</h1>

<ul>
<li><font size=6><a href="https://www.nxp.com/docs/en/user-guide/UM10204.pdf" rel="nofollow noreferrer" target="_blank">I<sup>2</sup>C-bus specification and user manual</a></font></li>
</ul>

    </div>

    <div class="post-copyright">
             
            <p class="copyright-item">
                <span>Author:</span>
                <span>Mr.wei </span>
                </p>
            
           
             
            <p class="copyright-item">
                    <span>Link:</span>
                    <a href=http://blog.mr-wei.cn/2019/i2c%E7%AE%80%E8%BF%B0/>http://blog.mr-wei.cn/2019/i2c%E7%AE%80%E8%BF%B0/</span>
            </p>
            
             
            <p class="copyright-item lincese">
                本文采用<a rel="license" href="http://creativecommons.org/licenses/by-nc/4.0/" #target="_blank">知识共享署名-非商业性使用 4.0 国际许可协议</a>进行许可
            </p>
            
    </div>

  
    <div class="post-tags">
        
            <section>
            <i class="iconfont icon-tag"></i>Tag(s): 
            
            <span class="tag"><a href="http://blog.mr-wei.cn/tags/i2c/">
                    #I2C</a></span>
            
            </section>
        
        <section>
                <a href="javascript:window.history.back();">back</a></span> · 
                <span><a href="http://blog.mr-wei.cn">home</a></span>
        </section>
    </div>

    <div class="post-nav">
         
        
        <a href="http://blog.mr-wei.cn/2019/uart%E7%AE%80%E8%BF%B0/" class="next" rel="next" title="UART简述">UART简述&nbsp;<i class="iconfont icon-right"></i></a>
        
    </div>

    <div class="post-comment">
          
                 
          
    </div>
</article>
          </div>
		   </main>
      <footer class="footer">
    <div class="copyright">
        &copy;
        
        <span itemprop="copyrightYear">2018 - 2019</span>
        
        <span class="with-love">
    	 <i class="iconfont icon-love"></i> 
         </span>
         
            <span class="author" itemprop="copyrightHolder"><a href="http://blog.mr-wei.cn">Mr.wei</a> | </span> 
         

         
            <a href="http://www.miibeian.gov.cn/" target="_blank" rel="external nofollow">冀ICP备 - 18032379号 </a> |
         
		  <span>Powered by <a href="https://gohugo.io/" target="_blank" rel="external nofollow">Hugo</a> & <a href="https://github.com/liuzc/leaveit" target="_blank" rel="external nofollow">LeaveIt</a></span> 
    </div>

	
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [['$','$'], ['\\(','\\)']],
            displayMath: [['$$','$$'], ['\[','\]']],
            processEscapes: true,
            processEnvironments: true,
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
            TeX: {
                equationNumbers: { autoNumber: "AMS" },
                extensions: ["AMSmath.js", "AMSsymbols.js"]
            }
        }
    });
</script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>
	
	

</footer>












    
     <link href="//lib.baomitu.com/lightgallery/1.6.11/css/lightgallery.min.css" rel="stylesheet">  
      
     <script src="/js/vendor_gallery.min.js" async="" ></script>
    
  



     </div>
  </body>
</html>
